package com.cskaoyan.javase.oop1._12block._2building;
/**
 * > 总结一下到目前为止，创建对象过程中可能碰到的结构的执行顺序：
 * new对象过程中，各种结构的执行顺序：
 * 1. 对象结构存在后就进行默认初始化，所有成员变量都具有默认值后，再开始其余赋值操作
 * 2. 找到new对象的那个构造器，
 *    - 如果它的首行显式地调用了另一个构造器
 *      （注：显式调用构造器可以使用this、super两个关键字，this已经学习，super后面学习）
 *      - 那么程序会先跳转到那个构造器，但是不会立刻执行，而是：
 *        - 按照类中构造代码块和显式赋值的代码书写顺序，从上到下执行其中的代码，执行完毕后：
 *      - 跳转回this或者super执行的构造器，执行完毕后：
 *      - 最终跳转回new对象构造器，执行完毕后，创建对象结束
 *    - 如果它的首行没有显式调用另一个构造器
 *      - 那么会先从上到下执行构造代码块和显式赋值代码，执行完毕后：
 *      - 跳转回new对象构造器，执行完毕后，创建对象结束
 * 3. 以上总结，没有引入继承的概念，并不全面，我们会在继承中补全它
 *
 * > 一些使用构造代码块需要注意的地方：
 * 1. 建议应该将构造代码块，放在成员变量的声明和显式赋值语句的下面
 *    - 一方面，如果构造代码块赋值在上，成员变量声明在下，逻辑上会很奇怪
 *    - 另一方面，如果对象中成员变量的赋值，依赖于构造代码块和显式赋值的代码书写顺序，容易引发错误
 * 2. 因为构造代码块最终会加入构造器，所以构造代码块当中也可以使用this关键字，表示当前对象
 *    - 但是实际使用价值和意义不大，仅作了解。
 *
 * 
 * @since 10:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        Person p1 = new Person("杨超越", 18);
        System.out.println(p1.name);
        System.out.println(p1.age);
    }
}
class Person {
    {
        age = 28;
    }
    String name = "马云";
    int age = 48;
    {
        name = "东哥";
    }
    public Person(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this(age);
        this.name = name;
    }
}
